package com.own.component.token.base;

import com.own.constant.ConstantCommon;

import java.util.Set;

/**
 * StoreTokenManager
 *
 * @author chenxueli
 * @date 2023-11-07 19:49:19
 */
public interface StoreTokenManager {

    String USER_ID_PREFIX = "l" + ConstantCommon.REDIS_SEPARATE + "user" + ConstantCommon.REDIS_SEPARATE + "id" + ConstantCommon.REDIS_SEPARATE;
    String TOKEN_PREFIX = "l" + ConstantCommon.REDIS_SEPARATE + "token" + ConstantCommon.REDIS_SEPARATE;

    /**
     * 获取客户端id
     *
     * @return 客户端id
     */
    String getDefaultClient();

    /**
     * 创建一个token
     *
     * @param userId 用户id
     * @return 生成的登录令牌
     */
    default String createToken(Long userId) {
        return createToken(userId, getDefaultClient());
    }

    /**
     * 创建一个token
     *
     * @param userId 用户id
     * @param client 客户端id
     * @return 生成的登录令牌
     */
    String createToken(Long userId, String client);

    /**
     * 检查 token 是否有效
     *
     * @param token 登录令牌
     * @return 是否有效
     */
    default boolean checkToken(String token) {
        return checkToken(token, getDefaultClient());
    }

    /**
     * 检查 token 是否有效
     *
     * @param token  登录令牌
     * @param client 客户端id
     * @return 是否有效
     */
    boolean checkToken(String token, String client);

    /**
     * 获取token
     *
     * @param userId 用户id
     * @return 登录令牌列表
     */
    default Set<String> listToken(Long userId) {
        return listToken(userId, getDefaultClient());
    }

    /**
     * 获取token
     *
     * @param userId 用户id
     * @param client 客户端id
     * @return 登录令牌列表
     */
    Set<String> listToken(Long userId, String client);

    /**
     * 获取token
     *
     * @param token 登录令牌
     * @return 用户id
     */
    default Long getUserId(String token) {
        return getUserId(token, getDefaultClient());
    }

    /**
     * 获取token
     *
     * @param token  登录令牌
     * @param client 客户端id
     * @return 用户id
     */
    Long getUserId(String token, String client);

    /**
     * 清除 token
     *
     * @param token 登录令牌
     */
    default void deleteByToken(String token) {
        deleteByToken(token, getDefaultClient());
    }

    /**
     * 清除 token
     *
     * @param token  登录令牌
     * @param client 客户端id
     */
    void deleteByToken(String token, String client);

    /**
     * 清除 token（会删除这个用户的所有token信息）
     *
     * @param userId 用户id
     */
    default void deleteByUserId(Long userId) {
        deleteByUserId(userId, getDefaultClient());
    }

    /**
     * 清除 token（会删除这个用户的所有token信息）
     *
     * @param userId 用户id
     * @param client 客户端id
     */
    void deleteByUserId(Long userId, String client);

    /**
     * 清除所有已配置的客户端的token
     *
     * @param userId 用户id
     */
    void deleteAllByUserId(Long userId);

    /**
     * 根据用户id，客户端id获取token
     *
     * @param userId           用户id
     * @param tokenBuildPolicy 令牌生成策略
     * @return 生成的登录令牌
     */
    default String createToken(Long userId, TokenBuildPolicy tokenBuildPolicy) {
        return createToken(userId, getDefaultClient(), tokenBuildPolicy);
    }

    /**
     * 根据用户id，客户端id获取token
     *
     * @param userId           用户id
     * @param client           客户端id
     * @param tokenBuildPolicy 令牌生成策略
     * @return 生成的登录令牌
     */
    String createToken(Long userId, String client, TokenBuildPolicy tokenBuildPolicy);

    /**
     * 构造登录token容器的key
     *
     * @param userId 用户id
     * @param client 客户端id
     * @return key
     */
    default String buildTokenContainerKey(Long userId, String client) {
        return client + ConstantCommon.REDIS_SEPARATE + USER_ID_PREFIX + userId;
    }

    /**
     * 构造用户id容器的key
     *
     * @param token  登录令牌
     * @param client 客户端id
     * @return key
     */
    default String buildUserIdContainerKey(String token, String client) {
        return client + ConstantCommon.REDIS_SEPARATE + TOKEN_PREFIX + token;
    }

}
